<?php
/**
 * Smarty shared plugin
 *
 * @package Smarty
 * @subpackage PluginsShared
 */

if (! function_exists ( 'smarty_mb_wordwrap' )) {
	
	/**
	 * Wrap a string to a given number of characters
	 *
	 * @link http://php.net/manual/en/function.wordwrap.php for similarity
	 * @param $str string
	 *       	 the string to wrap
	 * @param $width int
	 *       	 the width of the output
	 * @param $break string
	 *       	 the character used to break the line
	 * @param $cut boolean
	 *       	 ignored parameter, just for the sake of
	 * @return string wrapped string
	 * @author Rodney Rehm
	 */
	function smarty_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false) {
		// break words into tokens using white space as a delimiter
		$tokens = preg_split ( '!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, - 1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE );
		$length = 0;
		$t = '';
		$_previous = false;
		
		foreach ( $tokens as $_token ) {
			$token_length = mb_strlen ( $_token, Smarty::$_CHARSET );
			$_tokens = array ($_token );
			if ($token_length > $width) {
				// remove last space
				$t = mb_substr ( $t, 0, - 1, Smarty::$_CHARSET );
				$_previous = false;
				$length = 0;
				
				if ($cut) {
					$_tokens = preg_split ( '!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, - 1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE );
					// broken words go on a new line
					$t .= $break;
				}
			}
			
			foreach ( $_tokens as $token ) {
				$_space = ! ! preg_match ( '!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token );
				$token_length = mb_strlen ( $token, Smarty::$_CHARSET );
				$length += $token_length;
				
				if ($length > $width) {
					// remove space before inserted break
					if ($_previous && $token_length < $width) {
						$t = mb_substr ( $t, 0, - 1, Smarty::$_CHARSET );
					}
					
					// add the break before the token
					$t .= $break;
					$length = $token_length;
					
					// skip space after inserting a break
					if ($_space) {
						$length = 0;
						continue;
					}
				} else if ($token == "\n") {
					// hard break must reset counters
					$_previous = 0;
					$length = 0;
				} else {
					// remember if we had a space or not
					$_previous = $_space;
				}
				// add the token
				$t .= $token;
			}
		}
		
		return $t;
	}

}
?>